package com.electronic.appearance;

import com.electronic.exception.ServiceException;
import com.electronic.utils.ISvgUtil;
import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.geom.Rectangle;
import lombok.Data;

/**
 * @Author: IFCA
 * @Description: 签名域基础信息
 */
@Data
public abstract class AbstractAppearance implements Cloneable {
    /**
     * 印章数据
     */
    private byte[] stamperSr;
    /**
     * 要签名的字段名称
     */
    private String signFieldName;

    /**
     * 矩形区域
     */
    private Rectangle rectangle;
    /**
     * 是否为左上角坐标
     */
    private boolean isUpperLeftCoordinate = true;

    /**
     * 页码
     */
    private int pageNum;

    /**
     * 图像数据
     */
    private ImageData imageData = null;

    /**
     * 是否为 SVG 图像
     */
    private boolean isSvgImage = false;
    /**
     * 每英寸点数（DPI）
     */
    private int dpi = 0;

    /**
     * 原因
     */
    private String reason = "";
    /**
     * 位置
     */
    private String location = "";

    /**
     * 透明度
     */
    private float transparency = 1.0F;

    /**
     * 设置 DPI，如果小于等于 0 则设置为默认值 96
     *
     * @param dpi DPI 值
     */
    public void setDpi(int dpi) {
        if (dpi <= 0) {
            this.dpi = 96;
        } else {
            this.dpi = dpi;
        }
    }

    /**
     * 设置印章数据，并进行相关的图像类型处理和数据设置
     *
     * @param stamperSr 印章数据字节数组
     */
    public void setStamperSr(byte[] stamperSr) {
        this.stamperSr = stamperSr;
        if (null != stamperSr) {
            if (ImageDataFactory.isSupportedType(stamperSr)) {
                this.imageData = ImageDataFactory.create(stamperSr);
                this.isSvgImage = false;
            } else {
                if (!ISvgUtil.isSvg(stamperSr)) {
                    throw new ServiceException("图像类型未知!");
                }
                this.isSvgImage = true;
            }
        }

    }

    /**
     * 克隆当前对象
     *
     * @return 克隆后的对象
     * @throws CloneNotSupportedException 如果克隆不支持则抛出此异常
     */
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
